package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.SMSUtils;
import com.itheima.reggie.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author ：sean
 * @date ：Created in 2022/5/22
 * @description ：用户控制器
 * 移动端用户
 * @version: 1.0
 */
@RequestMapping("/user")
@Slf4j
@RestController
public class UserController {

	@Autowired
	private RedisTemplate redisTemplate;

	@Autowired
	private UserService userService;

	//方法，接收路径，方法名，参数，返回类型
	// 数据，能实体类先用实体类，也是用到模型（User表），实体类是不是User

	/**
	 * 发送验证码
	 * @param user
	 * @param session
	 * @return
	 */
	@PostMapping("/sendMsg")
	public R<String> sendMsg(@RequestBody User user, HttpSession session){
		log.info("[手机登录:发送验证码],user:{}",user);
		// 调用阿里云发送 9:00发出去
		if(StringUtils.isNotEmpty(user.getPhone())){
			// 产生验证码
			Integer validateCode = ValidateCodeUtils.generateValidateCode(4);
			log.info("[手机登录:发送验证码]，验证码:{}",validateCode);
			// 通过阿里云发送,阿里云测试，不要每次都测，一定业务都跑通了再测
			// 这个是手机中看验证码
			//SMSUtils.sendMessage(
			//	"传智健康项目基手机号登录",
			//	"SMS_175532136",
			//	user.getPhone(),validateCode+""
			//);
			// 在session中验证码存起来，过一会儿登录时要验证
			// 1425
			//session.setAttribute(user.getPhone(),validateCode+"");
			redisTemplate.opsForValue().set(
				user.getPhone(), validateCode+"",
				5, TimeUnit.MINUTES);
			return R.success("发送成功");
		}
		return R.success("发送失败");
	}
	// {"phone":"13311002200","code":"1425"}
	// 登录的接口
	@PostMapping("/login")
	public R<User> login(@RequestBody Map mapData, HttpSession session){
		log.info("[手机登录],map:{}",mapData);
		// 如何判定用户登录，不是需要验证你的验证码是不是我发送的呀，验证码真伪？
		String phone = (String)mapData.get("phone");
		String code = (String)mapData.get("code");
		// 从session中获取的之前发送的验证码
		// String codeInSession = (String)session.getAttribute(phone);
		// 从redis读取
		String codeInRedis = redisTemplate.opsForValue().get(phone).toString();
		log.info("[手机登录],从Redis读,{}",codeInRedis);

		if(codeInRedis!=null && codeInRedis.equals(code)){
			// 代表可以登录
			// 登陆成功之，需要把登录的用户ID，发送给前端
			// 一般主要手机号登录，会自动注册
			// 基本思路：判定当前用户是否注册过，如果没有，自动注册 （行业潜规则）
			// 判定当前用户是否注册过(基于手机号)
			// UserService,UserMapper
			LambdaUpdateWrapper<User> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
			userLambdaUpdateWrapper.eq(User::getPhone,phone);
			User one = userService.getOne(userLambdaUpdateWrapper);
			if (one == null){
				// 这个手机号不存在(用户不存在），直接注册，设置启用状态
				one = new User();
				one.setPhone(phone);
				one.setStatus(1);//启用，可用
				userService.save(one);
			}
			session.setAttribute("user",one.getId());
			// 最后过滤器，需要改一下
			// 登录成功，验证码删除
			redisTemplate.delete(phone);
			return R.success(one);
		}
		return R.error("登录失败");
	}

}
